// 作用域与闭包
function hd() {
    let n = 0;
    return function () { 
        let m = 0;
        return function() {
            return {
                m: ++m,
                n: ++n
            }
        }
     }
};
let a = hd()();
let res = a();
res = a();
res = a();
res = a();
// console.log('hd=>', res);



// 闭包在构造函数中的 形态
function Hd() {
    let n = 0;
    this.sum = function() {
        ++n;
        console.log("Hd=>n=>", n);
    }
};
let hdInstance = new Hd();
// hdInstance.sum();
// hdInstance.sum();
// hdInstance.sum();


function Hd2() {
    let n = 0;
    function sum() {
        ++n;
        console.log('Hd2=>n=>', n);
    };
    return {
        sum: sum
    }
}
let hd2= Hd2();
// hd2.sum();
// hd2.sum();
// hd2.sum();

// let const var在for循环中的执行原理
for(var i = 0; i < 4; i++) {
    console.log('var-for=>' ,i);
};
console.log('window.i=', window.i);
console.log('----------window.i=4-------------');

for(let l = 0; l < 4; l++) {
    console.log('let-for=>' ,l);
};
console.log('window.l=', window.l);
console.log('---------window.l=undefined--------------');

for(var li = 0; li < 4; li++) {
    (function(li) {
        console.log('var-for=>' ,li);
    })(li);
};
console.log('window.li=', window.li);
console.log('---------window.li=4--------------');

for(var q = 0; q < 4; q++) {
    setTimeout(_ => {
        console.log('var-for-setTimeout=>' ,q);
    }, 0);
};
console.log('window.q=', window.q);
setTimeout(_ => {
    console.log('---------window.q=4--------------');
}, 1);


for(var w = 0; w < 4; w++) {
    (function(w) {
        setTimeout(_ => {
            console.log('var-for-setTimeout=>' ,w);
        }, 0);
    })(w);
};
console.log('window.w=', window.w);
setTimeout(_ => {
    console.log('---------window.w=4--------------');
}, 1);

for(let e = 0; e < 4; e++) {
    setTimeout(_ => {
        console.log('var-for-setTimeout=>' ,e);
    }, 0);
}
console.log('window.e=', window.e);
console.log('---------window.e=undifined--------------');